/**
 * 跨域资源共享（CORS）过滤器，用于允许来自不同域的HTTP请求访问服务器资源。
 * 通过动态添加响应头来实现跨域访问控制。
 */
package org.graduation.recruitment.filter;

import jakarta.servlet.*;
import jakarta.servlet.annotation.WebFilter;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;

import java.io.IOException;

// 定义一个Web过滤器，用于处理所有请求的跨域问题
@WebFilter(filterName = "CROSFilter", urlPatterns = "/*")
@Order(1) // 确定过滤器的执行顺序
@Component // 标记为Spring组件，使其能被Spring容器管理
public class CROSFilter implements Filter {

    /**
     * 过滤器初始化方法。
     *
     * @param filterConfig 过滤器配置对象，提供过滤器的配置信息。
     * @throws ServletException 如果初始化过程中出现Servlet相关异常。
     */
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
    }

    /**
     * 处理请求的过滤方法。
     *
     * @param servletRequest  客户端的请求对象。
     * @param servletResponse 用于向客户端发送响应的对象。
     * @param filterChain     过滤器链，用于将请求传递给下一个过滤器或servlet。
     * @throws IOException      如果处理请求或响应时发生IO异常。
     * @throws ServletException 如果处理请求或响应时发生Servlet相关异常。
     */
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)
            throws IOException, ServletException {
        HttpServletResponse httpResponse = (HttpServletResponse) servletResponse;
        HttpServletRequest httpRequest = (HttpServletRequest) servletRequest;

        // 添加跨域响应头
        httpResponse.setHeader("Access-Control-Allow-Origin", "*");
        httpResponse.setHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS");
        httpResponse.setHeader("Access-Control-Allow-Headers", "Content-Type, Authorization, X-Requested-With");

        // 如果请求方法为OPTIONS，提前返回，不继续执行后续逻辑
        if ("OPTIONS".equalsIgnoreCase(httpRequest.getMethod())) {
            httpResponse.setStatus(HttpServletResponse.SC_OK);
            return;
        }

        // 继续处理请求
        filterChain.doFilter(servletRequest, servletResponse);
    }

    /**
     * 过滤器销毁方法，用于执行过滤器的清理工作。
     */
    @Override
    public void destroy() {
        // 这里可以添加资源释放操作
    }
}

